home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok81 / m2 / demos / txt / features.mod < prev    next >
Text File  |  1993-11-04  |  7KB  |  252 lines

  1. (*
  2.  * August 1992/bp/AMSoft
  3.  * Dieses Modul ist wenig sinnvoll, es soll lediglich viele der
  4.  * Möglichkeiten des M2Amiga-Systems aufzeigen.
  5.  *
  6.  * In der Demo-Version sind Register- und externe Variablen nicht erlaubt!
  7.  *
  8.  *)
  9. MODULE Features;
  10.  
  11. (*
  12.  * Compileroptionen können an jedem Ort abgefragt, aber einige nur
  13.  * an bestimmten Orten verändert werden.
  14.  * Vordefinierte Namen aller Compileroptionen:
  15.  * Die Buchstaben und Ziffern in Klammern bezeichnen die Angabe
  16.  * der entsprechenden Option von der Kommandozeile.
  17.  * CaseChk     (c)
  18.  * ChipBSS
  19.  * ChipCODE
  20.  * ChipDATA
  21.  * CopyDyn
  22.  * CStrings
  23.  * EntryExitCode
  24.  * Implementation
  25.  * Joker     (j)
  26.  * LargeVars     (y) (-y => residente Programme!)
  27.  * LoadA4
  28.  * LongAlign     (l)
  29.  * m68010     (1)
  30.  * m68020     (2)
  31.  * m68030     (3)
  32.  * m68040     (4)
  33.  * m68881     (8)
  34.  * NameChk
  35.  * NilChk     (n)
  36.  * OverflowChk     (v)
  37.  * ParDealloc
  38.  * RangeChk     (r)
  39.  * ReturnChk     (f)
  40.  * SaveA4
  41.  * SaveAllRegs
  42.  * StackChk     (s)
  43.  * StackParms     (z)
  44.  * Volatile     (h)
  45.  * (d) => -d heißt: Code optimieren und kein .ref-File erzeugen
  46.  *)
  47. (*
  48.  * Dies ist eine Compiler-Anweisung. Compiler-Anweisungen beginnen
  49.  * mit (,* und $. Diese Anweisung löscht die Option LargeVars,
  50.  * woraufhin dieses Modul im SMALL-Data-Modell kompiliert wird.
  51.  *)
  52. (*$ LargeVars:=FALSE *)
  53.  
  54. (*
  55.  * Die nachfolgende Compiler-Anweisung deklariert eine
  56.  * benutzerdefinierte Option und belegt sie mit dem Wert FALSE.
  57.  * Wenn der Bediener von der Kommandozeile "+oEnglish" eingibt,
  58.  * erhält die Option den Wert TRUE.
  59.  *)
  60. (*$ DEFINE English:=FALSE *)
  61.  
  62. FROM SYSTEM    IMPORT    ADR,ASSEMBLE,CAST,TAG;
  63. FROM DosD    IMPORT    FileInfoBlock;
  64. IMPORT
  65.     Arts,
  66.     R,
  67.     IL:IntuitionL,
  68.     ID:IntuitionD;
  69.  
  70. CONST
  71. (*
  72.  * Wir deklarieren nun eine Konstante, die abhängig von der Option
  73.  * "English" unterschiedliche Werte erhält.
  74.  * Nebenbei geben wir noch einmal ausdrücklich auf dem Bildschirm
  75.  * aus, welche Version wir gerade erstellen.
  76.  *)
  77.   (*$ IF English "Dies wird eine englische Version!\n\n" *)
  78.     message="No Window!";
  79.   (*$ ELSE "Deutsche Version!\n\n" *)
  80.     message="Kein Fenster!";
  81.   (*$ ENDIF *)
  82.  
  83. VAR
  84. (*
  85.  * Die nachfolgende Variable wird auf einer Langwortgrenze
  86.  * abgelegt, die dos.library wird es uns danken:
  87.  *)
  88.   (*$ LongAlign:=TRUE *)
  89.   info: FileInfoBlock;
  90. (*
  91.  * Die nächsten Variablen werden entweder auf Wort- oder auf
  92.  * Langwortgrenzen abgelegt. Dies hängt davon ab, welche Optionen
  93.  * der Bediener von der Kommandozeile angab.
  94.  *)
  95.   (*$ POP LongAlign *) (* alten Wert wiederherstellen *)
  96.   i,j:INTEGER;
  97. (*
  98.  * Die folgenden Variablen und Prozeduren sind extern, d.h. mit
  99.  * einem fremden Assembler oder Compiler erstellt.
  100.  * Die erste Variable muß in einem Hunk mit den Namen __MERGED
  101.  * liegen und wird als SMALL-Variable deklariert.
  102.  * Die zweite Variable "chipImage" wird als LARGE-Variable
  103.  * deklariert und somit absolut adressiert. Da wir später nur
  104.  * ihre Adresse benötigen, deklarieren wir sie einfach als INTEGER.
  105.  * Da die Symbole einen Unterstrich enthalten, werden sie vom
  106.  * Linker in der Datei "FDemo.obj" gesucht, andernfalls müßten
  107.  * wir ihm den Dateinamen angeben.
  108.  *)
  109.   myMenu[<"FDemo_Menu"]: ID.Menu;
  110.   chipImage["FDemo_Image"]: INTEGER;
  111.  
  112. PROCEDURE Extern(VAR i: INTEGER; j:LONGINT):LONGINT; "FDemo_Proc";
  113.  
  114.  
  115. (*
  116.  * Die folgende Prozedur demonstriert den Gebrauch von Register-
  117.  * Variablen und -Parametern. Zwei INTEGER-Variablen werden
  118.  * vertauscht. Die Parameter legen wir in Adressregister, weil
  119.  * sie VAR-Parameter sind, die aufrufende Prozedur also ihre Adressen
  120.  * übergibt. Der generierte Code steht in den Kommentaren.
  121.  *)
  122. PROCEDURE Swap(VAR a{R.A0},b{R.A1}:INTEGER);
  123. VAR help{R.D0}:INTEGER;
  124. BEGIN
  125.   help:=a;  (* MOVE.W (A0),D0    *)
  126.   a:=b;     (* MOVE.W (A1),(A0)  *)
  127.   b:=help;  (* MOVE.W D0,(A1)    *)
  128. END Swap;   (* RTS               *)
  129.  
  130. (*
  131.  * Diese Prozedur demonstriert die Benutzung des Assemblers und der
  132.  * bedingten Kompilierung. Sie multipliziert zwei Zahlen und liefert
  133.  * den Betrag des Ergebnisses zurück. Das Gleiche würde natürlich durch
  134.  * den Ausdruck ABS(a*b) erreicht! Wir sehen hieran auch, daß die
  135.  * bedingte Kompilierung verschachtelt sein darf, und daß jede Option
  136.  * abgefragt werden kann.
  137.  * Da wir sie komplett in Assembler implementieren, darf der Compiler
  138.  * keinen Ein- und Ausgangscode generieren, was wir durch eine
  139.  * Compiler-Anweisung verhindern.
  140.  * Die Prozedur ist mit bedingter Kompilierung künstlich überladen,
  141.  * um einige Möglichkeiten aufzuzeigen. Man sollte sie GENAU ansehen!
  142.  *)
  143. (*$ EntryExitCode:=FALSE *)
  144. PROCEDURE MulAbs(z1,z2:LONGINT):LONGINT;
  145. BEGIN
  146.   ASSEMBLE(
  147.      (*$ IF NOT EntryExitCode *) (* Ist zwar hier sicher AUS, aber
  148.                   * vielleicht ändern wir es später? *)
  149.     LINK    A5,#0    (* Im Grunde unnötig, erleichtert aber
  150.              * die Adressierung der Parameter *)
  151.      (*$ ENDIF *)
  152.  
  153.      (*$ IF m68020 *)   (* Wird dies Modul für die 68020 oder höhere
  154.              * kompiliert, dürfen wir MULS.L benutzen? *)
  155.     MOVE.L    z1(A5),D0
  156.     MULS.L    z2(A5),D0
  157.        (*$ IF OverflowChk *) (* Soll eine Überlaufprüfung erfolgen? *)
  158.     TRAPVS
  159.        (*$ ENDIF *)
  160.      (*$ ELSE *)    (* Nicht 68020ff, wir brauchen Arts! *)
  161.     MOVE.L    z1(A5),D0
  162.     MOVE.L    z2(A5),D1
  163.     JSR    Arts.Muls32(PC)
  164.        (*$ IF OverflowChk *) (* Soll eine Überlaufprüfung erfolgen? *)
  165.     TRAPV
  166.        (*$ ENDIF *)
  167.      (*$ ENDIF *)
  168.  
  169.     TST.L    D0    (* Die Flags sind zwar schon gesetzt, aber *)
  170.     BPL.S    IsPos   (* wir wollen doch auch noch ein Label zeigen *)
  171.     NEG.L    D0
  172. IsPos:
  173.  
  174.      (*$ IF NOT EntryExitCode *)
  175.     UNLK    A5
  176.      (*$ ENDIF *)
  177.  
  178.      (*$ IF m68010 AND NOT EntryExitCode *) (* Wir müssen die Parameter
  179.                          * selbst abbauen, dürfen
  180.                          * wir RTD benutzen? *)
  181.     RTD    #4    (* Wir haben 2 INTEGER, also 4 Byte *)
  182.      (*$ ELSIF NOT EntryExitCode *)    (* Nein, 68000! *)
  183.     MOVE.L    (A7)+,A0
  184.     ADDQ.L    #4,A7
  185.     JMP    (A0)
  186.      (*$ ENDIF *)
  187.  
  188.   END);
  189. END MulAbs;
  190.  
  191. (*
  192.  * Eine typisierte Konstante:
  193.  *)
  194. TYPE
  195.   MyArr8 = ARRAY [0..7] OF INTEGER;
  196. CONST
  197.   mix = MyArr8{ -10, 5, 9, 0, 0, 4, 3, 1};
  198.   alleEins = MyArr8{ 1, ..};
  199.  
  200. (*
  201.  * Nun kommt eine initialisierte Variable:
  202.  *)
  203. VAR
  204.   myNewWin:=ID.NewWindow{
  205.     leftEdge: 150,    topEdge: 90,
  206.     width:200,    height: 80,
  207.     detailPen: 0,    blockPen: 1,
  208.     idcmpFlags: ID.IDCMPFlagSet{},
  209.     flags: ID.WindowFlagSet{ID.windowDrag,ID.windowDepth,
  210.                 ID.windowSizing,ID.activate},
  211.     title: ADR("Mein altes Fenster"),
  212.     screen: NIL,
  213.     (* alle anderen Elemente sind 0 *)
  214.     type:ID.ScreenFlagSet{ID.wbenchScreen}
  215.     };
  216.  
  217.   tagBuffer: ARRAY [0..14] OF LONGINT;
  218.   myWin: ID.WindowPtr;
  219.  
  220. (*
  221.  * Im Hauptprogramm öffnen wir ein Window und warten ein Weilchen
  222.  * Falls das Fenster nicht geöffnet werden konnte, bringt das Modul
  223.  * Arts in einem Requester die Fehlermeldung auf den Schirm.
  224.  *)
  225. BEGIN (* Hauptprogramm *)
  226.   IF Arts.kickVersion>=37 THEN (* haben wir Kickstart 2.0? *)
  227.     myWin:=IL.OpenWindowTagList(NIL,TAG(tagBuffer,
  228.     ID.waLeft,    150,
  229.     ID.waTop,    90,
  230.     ID.waWidth,    200,
  231.     ID.waHeight,    90,
  232.     ID.waIDCMP,    0,
  233.     ID.waFlags,    ID.WindowFlagSet{ID.windowDrag,ID.windowDepth,
  234.                 ID.windowSizing,ID.activate},
  235.     ID.waTitle,    ADR("Mein neues Fenster"),
  236.     0));
  237.   ELSE
  238.     myWin:=IL.OpenWindow(myNewWin);
  239.   END;
  240.   Arts.Assert(myWin <> NIL, ADR(message));
  241.   Arts.BreakPoint(ADR("Absichtliche Unterbrechung"));
  242. (*
  243.  * Der folgende Code wird am Programmende ausgeführt. Hier wird das
  244.  * Fenster geschlossen, wenn es noch geöffnet ist.
  245.  *)
  246. CLOSE
  247.   IF myWin#NIL THEN
  248.     IL.CloseWindow(myWin);
  249.     myWin:=NIL
  250.   END;
  251. END Features.
  252.